package controller

import (
	"github.com/gin-gonic/gin"
	_ "system-admin/docs" //必须：导入你上一步生成的docs
	"system-admin/internal/dao"
	"system-admin/internal/messageJSON"
	"system-admin/internal/models"
	"system-admin/internal/service"
	"system-admin/internal/utils"
)

// operation for User
type userController struct{}

// 获取用户控制器对象
func GetUserController() (userController *userController) {
	return userController
}

// 将req请求里的数据绑定在新创建的普通模型上并返回
func ReqBindObject(c *gin.Context) (user *models.User) {
	user = dao.NewUserObject()
	c.Bind(&user)
	return
}

// UserRegisterHandler 用户注册
// @Summary 用户注册接口
// @Schemes
// @Description 允许用户注册描述
// @Tags 后端接口列表名
// @Accept json
// @Produce json
// @Success 200
// @Router /register [post]
func (u *userController) UserRegisterHandler(c *gin.Context) {
	//将请求里的数据绑定在新创建的模型
	registerUser := &models.RegisterUser{}
	c.Bind(&registerUser)
	//获取用户服务对象
	userService := service.GetUserService()

	//校验数据（查询数据库是否存在该用户名）
	result := userService.QueryUserExist(registerUser)
	if result == true {
		//如果查询到则说明用户存在，返回错误
		messageJSON.UserRegisterExistsFail(c)
	} else {
		//用户不存在，开始注册
		userService.AddUser(registerUser)
		messageJSON.UserRegisterVeriftyOK(c)
	}
}

// UserLoginHandler 用户登录
// @param username query string false "用户名"
// @param password query string false "密码
// @Summary 用户登录接口
// @Description 允许用户登录描述
// @Tags 用户模块
// @Success 200
// @Router /login [post]
func (u *userController) UserLoginHandler(c *gin.Context) {
	user := ReqBindObject(c)

	userService := service.GetUserService()
	result := userService.UserLogin(user)

	if result == true {
		//验证成功允许登录
		messageJSON.UserLoginVerifyOK(c)
	} else {
		//验证失败,不通过
		messageJSON.UserLoginVerifyFail(c)
	}
}

// 获取排名数据
func (u *userController) UserRankingRegisterBoardHandler(c *gin.Context) {
	userService := service.GetUserService()
	userList, result, row := userService.QueryUserByLimitAndOrderByLevel()

	if result == true {
		//如果查询到说明获取到了
		messageJSON.GetUserRegisterRankingBoardOK(c, userList, row)
	} else {
		//查询不到
		messageJSON.UserRegisterRankingBoardFail(c)
	}
	return
}

func (u *userController) SendMsg(c *gin.Context) {
	redisConn := utils.GetRedis()
	utils.Publish(redisConn, "SUBSCRIBE", "example")
	c.Abort()
}
